package test;

/**

 *
 *java是一门面向对象的语言，输出helloWorld的时候需要类加方法，
 * c++则直接用int main（）    cout << "helloWorld "<< endl ; return 0;
 * 2）对象封装原则
 * a）内聚：指一个模块（类）内部各个部分之间的关联程度，尽可能类的每个成员方法只完成一件事
 * b) 耦合：指各个模块（类）之间的关联程度，减少类内部，对其他类的调用
 * 用类实现封装，用封装来实现高内聚，低耦合
 *   封装就是隐藏对象的属性和实现细节，，仅提供公共访问方式来让外界访问。private,默认(什么也不加),protected,public
 *
 * 继承：Java中的继承是一个对象获取父对象的所有属性和行为的机制。
 *
 *
 *      我们可以使用子类继承父类(共性的抽取)的方式去实现代码的复用。
 *  *
 *  *   * 成员变量可以在构造方法赋值
 *  *  * 常量可以在静态代码块赋值
 *  *  *
 *  *子类无法访问父类中用private修饰成员变量，但是父类中用private修饰的成员变量是会被子类继承的，但是不能直接访问（debug测试）
 *   静态变量也会被继承，但是被存在隐藏这一说法
 *   1). 静态方法和属性是属于类的，调用的时候直接通过类名.方法名完成对，不需要继承机制及可以调用。如果子类里面定义了静态方法和属性，那么这时候父类的静态方法或属性称之为"隐藏"。如果你想要调用父类的静态方法和属性，直接通过父类名.方法或变量名完成，至于是否继承一说，子类是有继承静态方法和属性，但是跟实例方法和属性不太一样，存在"隐藏"的这种情况。
 *   派生类复用了超类的全体数据和成员函数
 *
 *多态：
 *
 * 把一个方法与其所在的类/对象关联起来叫做方法的绑定。绑定分为静态绑定（前期绑定）和动态绑定（后期绑定）。
 * 静态绑定（前期绑定）是指在程序运行前就已经知道方法是属于那个类的，在编译的时候就可以连接到类的中，定位到这个方法。
 * 动态绑定（后期绑定）是指在程序运行过程中，根据具体的实例对象才能具体确定是哪个方法。
 *
 *实现多态的技术称为：动态绑定（dynamic binding），是指在执行期间判断所引用对象的实际类型，根据其实际的类型调用其相应的方法。
 *动态绑定是实现多态性的重要因素，当每个类加载到JVM时，保存各种数据，其中包括一个叫做方发表的东西
 * 表中记录了这个类定义的方法的指针，去指向一个具体的方法
 *
 *
 * 编译：
 * 发生向上造型，父类引用指向子类对象
 * Father ft =new Son()
 * fi.say();
 * 这里是根据声明的对象类型来查找的，
 * 所以此处是查找Father类的方法表，而Father类方法表中是没有子类新增的方法的，所以不能调用。）
 *编译阶段是确保方法的存在性，保证程序能顺利、安全运行。(例如我们的电脑，要有足够的硬件才能启动)
 * 编译阶段在声明对象类型的方法表中查找方法，只是为了安全地通过编译（也为了检验方法是否是存在的
 *
 * 运行：
 *在执行 Father ft =new Son()时，会自动创建一个son的实例对象，在fi。say（）调用方法时，jvm会把son对象压入操作数栈，用它进行调用
 * 而用实例对象进行方法调用的过程就是动态绑定
 *
 * (动态绑定过程中，属性是没有绑定机制的，但方法会有，所以当父类方法中有子类的方法时，也会去执行子类的方法体内容)
 *
 * 静态绑定：
 * 程序在JVM运行过程中，会把类的类型信息、static属性和方法、final常量等元数据加载到方法区
 * ，这些在类被加载时就已经知道，不需对象的创建就能访问的，就是静态绑定的内容；需要等对象创建出来，使用时根据堆中的实例对象的类型才进行取用的就是动态绑定的内容
 *
 *   多态的三个条件：
 * a） 继承的存在(继承是多态的基础,没有继承就没有多态).
 * b） 子类重写父类的方法(多态下调用子类重写的方法).
 * c） 父类引用变量指向子类对象(子类到父类的类型转换).
 *
 *
 * 编译时多态：(静态联编) 指程序在编译时就可确定的多态性，通过重载机制实现
 * 运行时多态：(动态联编) 指必须在运行中才可确定的多态性，通过继承和虚函数
 *
 *
 * 多态的好处：
 *
 * a)可替换性：多态对已存在的代码具有可替换性,例如，多态对圆Circle类工作，对其他任何圆形几何体，如圆环，也同样工作。
 *
 * b)可扩充性：多态对代码具有可扩充性。新增子类不会影响已存在类的各种性质。
 *
 * c)灵活性：多态在程序中体现了灵活多样的操作，提高了使用效率（重载函数，重写函数）
 *
 * d)简化性：多态简化对应用软件的代码编写和修改过程，尤其在处理大量对象的运算和操作时，这个特点尤为突出和重要
 * ————————————————
 *
 *
 *   。在Java中，多态是同一个行为具有不同的表现方式或形态。
 *   在继承的基础上，重写父类中的成员方法并定义父类引用指向子类对象(向上造型)。
 */
public class Final {
    public static void main(String[] args) {
     //   System.out.println(AAA.i);
        AAA a =new AAA();
      //  a.getB();


        BBB b =new BBB();
       // b.getB();
        b.d=1;
//        AAA a= new BBB();
//        a.run();


    }
}

class AAA {
    private final static int i ; //底层做了优化 常量不会进行类加载
    private int b;
    static int c;
    int d;

    public int getB() {
        return b;
    }

    static {
        i=1;//被final修饰的变量如果没有赋值，可以在静态代码块进行赋值一次
        System.out.println("我是静态代码块");
    }

    public AAA() {
    }
    public void run(){
        System.out.println("跑步");
    }
}
class BBB extends AAA{
    public BBB(){
        System.out.println("我是BBB");
    }
    public void run(){
        System.out.println("跑步");
    }
    public void play(){
        System.out.println("玩游戏");
    }

}